/**
 * 给定N个高度为Hi的隔板，向最左边的第0个空灌水，每次灌一格
 * 对第i格，问第一次有水的时刻，for每一个i。
 * 对于Ai而言，第一次有水的前一刻，显然左边的水面平齐Hi
 * 对于Hi而言，令左边的隔板为Hj，则若 Hj < Hi，显然Hj是没有贡献的，因为水面必然要超过Hj
 * 所以要向左边找到第一个大于等于Hi的隔板，记作Ht，则从t到i-1都要灌上Hi。
 * 令Di是第i个隔板左边装满的时间，则答案就是 Di + 1
 * 按照之前的推导 Di = (i - t) * Hi + Dt
 * t可以用单调栈维护
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;
using Real = long double;

int N;
vi H;
vll D;

void proc(){    
    vector<pii> st;
    st.reserve(N + 1);
    st.emplace_back(0, H[0]);
    D.assign(N + 1, 0LL);

    for(int i=1;i<=N;++i){
        while(st.back().second < H[i]) st.pop_back();

        D[i] = (i - st.back().first + 0LL) * H[i] + D[st.back().first];
        st.emplace_back(i, H[i]);
        cout << D[i] + 1 << " ";
    } 
    cout << endl;
}

void work(){ 
    cin >> N;
    H.assign(N + 1, 0);
    for(int i=1;i<=N;++i)cin >> H[i];
    H[0] = 2E9;
    proc();
	return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}